#ifndef FRAME_THREAD_POOL_H
#define FRAME_THREAD_POOL_H

#include <sys/socket.h>   // socket(), setsockopt(), bind(), listen(), AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
#include <netinet/in.h>   // struct sockaddr_in, htons(), INADDR_ANY (如果使用)
#include <arpa/inet.h>    // inet_addr() (IP 地址转换)
#include <stdlib.h>       // atoi() (字符串转整数)
#include <sys/epoll.h>  // struct epoll_event, epoll 相关函数
#include <signal.h>  // signal(), SIGUSR1 及相关信号宏
#include <fcntl.h>      // 提供 open() 和文件打开标志（O_RDWR等）
#include <sys/stat.h>   // 可选：文件模式宏（如创建文件时用的权限位）
#include <unistd.h>     // 可选：提供 close() 和相关文件操作函数
#include <sys/sendfile.h>  // sendfile() 函数原型
#include <sys/wait.h>  // wait() 函数原型
#include <sys/types.h>  // pid_t 类型定义
#include <openssl/md5.h>  // 哈希  md5
//#define OPENSSL_API_COMPAT 0x10100000L
#include <openssl/sha.h>
#include <mysql/mysql.h>


#include "frame_task_queue.h"
#include "frame_tid_arr.h"

#include "struct_userOpInfo.h"
#include "struct_tlv.h"
#include "log.h"

#include "users_login.h"
#include "deal_command.h"  // 包含 struct_userOpInfo struct_tlv
#include "timeout_queue.h"

// #include "directory_operation.h"
// #include "transfile_server.h"



// 网盘存储用户文件的路径文件夹
#define userSpace "userSpace"



typedef struct threadPool_s {
    // 工人线程链表
    tidArr_t tidArr;
    // 任务队列
    taskQueue_t taskQueue;
    // 退出标志
    int exitFlag;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    MYSQL *mysql;

    int ID;
    char userName[1024];
    char opName[1024];
    
    commandType_t type;
} threadPool_t;


int threadPoolInit(threadPool_t *threadPool, int workerNum, MYSQL *mmysql);
void threadPoolFree(threadPool_t *threadPool);

int makeWorker(threadPool_t *threadPool);

int tcpInit(char *ip, char *port);

int epollAdd(int epfd, int fd);
int epollDel(int epfd, int fd);


// 建立网盘空间
int buildUserSpace();

// 根据用户名计算SHA-1哈希值
char* calculateSha1(const char* input);

// 根据路径计算对应的虚拟id
int pathToId(MYSQL* mysql, char *path);

#endif
